import re

from .models import User
from django.contrib.auth.backends import ModelBackend
def jwt_response_payload_handler(token,user=None,request=None):
    # 重写了该方法的返回值，该方法在底层给调用时会传token,user,request参数
    # 因为不是继承的重写了，而是修改配置改写了底层的该方法，
    # 在该项目哪里调用该方法都是调用重写后的此方法
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }


def get_user_count(account):
    """
    根据帐号获取user对象
    :param account: 账号，可以是用户名，也可以是手机号
    :return: User对象 或者 None
    """

    #　
    try:
        # 如果用户的用户名是手机号格式，判断有没这个用户名
        count = User.objects.filter(username=account).count()
        #问题：如果你注册的用户名是别人的手机号，你登录是以用户名形式登录成功，
        #但是别人用手机号登录就会判断为用户名登录，所以会登录失败
        if count==0 and re.match(r'[1][3-9]\d{9}',account):
            user = User.objects.get(mobile=account)
        else:
            user = User.objects.get(username=account)

    except Exception as e:
        return None

    else:
        return user


class UsernameMobileAuthBackend(ModelBackend):
    """
    自定义用户名或手机号认证
    """

    def authenticate(self, request, username=None, password=None, **kwargs):
        # username就是前端传来的用户填写数据，可以是手机号和用户名
        user = get_user_count(username)
        if user is not None and user.check_password(password):
            return user